Hint: Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

# load required libraries

# to use harry potter dataset
# devtools::install_github("bradleyboehmke/harrypotter")
# devtools::install_github("quanteda/quanteda.sentiment")
# devtools::install_github("quanteda/quanteda.corpora")



library(quanteda)
library(readtext)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(corpus)
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.4     ✓ dplyr   1.0.7
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   2.0.1     ✓ forcats 0.5.1
── Conflicts ─────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(stringr)
library(tidytext)
library(harrypotter)
library(janeaustenr)
library(dplyr)
library(quanteda.sentiment)
library(vader)
# load afinn lexicon

# manually -> convert to binary lexicon
afinn_dict <- read.csv("lexika/AFINN-111.txt", header = F, sep = "\t", stringsAsFactors = F)
afinn_binary <- dictionary(list(positive = afinn_dict$V1[afinn_dict$V2>0], negative = afinn_dict$V1[afinn_dict$V2<0]))

# provided via tidytext?
afinn <- get_sentiments("afinn")
dfm.sentiment <- dfm(korpus, dictionary = afinn_binary)
Warnung: 'dfm.corpus()' is deprecated. Use 'tokens()' first.
Warnung: 'dictionary' and 'thesaurus' are deprecated; use dfm_lookup() instead
dfm.sentiment
Document-feature matrix of: 12 documents, 2 features (0.00% sparse) and 1 docvar.
                features
docs             positive negative
  dal in              241      173
  d-heade             211      153
   of                 180      155
  scombe Valley       217      262
  ve Ora              151      198
  n with the Twi      195      225
[ reached max_ndoc ... 6 more documents ]

Harry Potter - Dataset

Harry Potter - AFINN Lexicon

afinn_hp1 <- series %>%
        group_by(book) %>% 
        mutate(word_count = 1:n(),
               index = word_count %/% 500 + 1) %>% 
        inner_join(get_sentiments("afinn")) %>%
        group_by(book, index, chapter) %>%
        summarise(sentiment = sum(value)) %>%
        mutate(method = "AFINN")
Joining, by = "word"
`summarise()` has grouped output by 'book', 'index'. You can override using the `.groups` argument.
afinn_hp1
afinn_hp2 <- series %>%
        group_by(book, chapter) %>% # add word for single word scores 
        inner_join(get_sentiments("afinn")) %>%
        group_by(book, chapter) %>% # add word for single word scores
        #summarise(sentiment = sum(value)) %>%
        summarise(sentiment = mean(value, na.rm = TRUE)) %>%
        mutate(method = "AFINN")  %>%
        ggplot(aes(chapter, sentiment, fill = book)) +
          geom_bar(alpha = 0.8, stat = "identity", show.legend = FALSE) +
          facet_wrap(~ book, ncol = 2, scales = "free_x")
Joining, by = "word"
`summarise()` has grouped output by 'book'. You can override using the `.groups` argument.
afinn_hp2


#ggsave(plot = afinn, width = 15, height = 15, dpi = 300, filename = "afinn_hp_mean.png")

Jane Austen - Dataset

tidy_books <- austen_books() %>%
  group_by(book) %>%
  mutate(
    linenumber = row_number(),
    chapter = cumsum(str_detect(text, 
                                regex("^chapter [\\divxlc]", 
                                      ignore_case = TRUE)))) %>%
  ungroup() %>%
  unnest_tokens(word, text)
pride_prejudice <- tidy_books %>% 
  filter(book == "Pride & Prejudice")

Jane Austen - AFINN Lexicon

afinn_austen <- pride_prejudice %>% 
  inner_join(get_sentiments("afinn")) %>% 
  group_by(index = linenumber %/% 80) %>% 
  summarise(sentiment = sum(value)) %>% 
  mutate(method = "AFINN")
Joining, by = "word"

load afinn via quanteda.sentiment

afinn2
Dictionary object with 1 key entry.
Valences set for keys: AFINN 
- [AFINN]:
  - abandon, abandoned, abandons, abducted, abduction, abductions, abhor, abhorred, abhorrent, abhors, abilities, ability, aboard, absentee, absentees, absolve, absolved, absolves, absolving, absorbed [ ... and 2,457 more ]
print(data_dictionary_AFINN, max_nval = 8)
Dictionary object with 1 key entry.
Valences set for keys: AFINN 
- [AFINN]:
  - abandon, abandoned, abandons, abducted, abduction, abductions, abhor, abhorred [ ... and 2,469 more ]

Lexicoder Sentiment Dictionary

require(quanteda)
Lade nötiges Paket: quanteda
Package version: 3.1.0
Unicode version: 13.0
ICU version: 69.1
Parallel computing: 8 of 8 threads used.
See https://quanteda.io for tutorials and examples.

Attache Paket: ‘quanteda’

Das folgende Objekt ist maskiert durch ‘.GlobalEnv’:

    data_dictionary_LSD2015
require(quanteda.corpora)
Lade nötiges Paket: quanteda.corpora
require(quanteda.sentiment)
Lade nötiges Paket: quanteda.sentiment

Attache Paket: ‘quanteda.sentiment’

Das folgende Objekt ist maskiert ‘package:quanteda’:

    data_dictionary_LSD2015
# tokenize hp1
hp1_tokenized <- tokens_tolower(tokens(philosophers_stone, remove_punct = TRUE)) 
  

# tokenize whole corpus
#tokenized_hp_all <- series %>%
 # toks <- tokens(remove_punct = TRUE, remove_symbols = TRUE) %>%
  #tokens_tolower(toks)
hp1_tokenized[[1]]
   [1] "THE"              "BOY"              "WHO"              "LIVED"           
   [5] "Mr"               "and"              "Mrs"              "Dursley"         
   [9] "of"               "number"           "four"             "Privet"          
  [13] "Drive"            "were"             "proud"            "to"              
  [17] "say"              "that"             "they"             "were"            
  [21] "perfectly"        "normal"           "thank"            "you"             
  [25] "very"             "much"             "They"             "were"            
  [29] "the"              "last"             "people"           "you'd"           
  [33] "expect"           "to"               "be"               "involved"        
  [37] "in"               "anything"         "strange"          "or"              
  [41] "mysterious"       "because"          "they"             "just"            
  [45] "didn't"           "hold"             "with"             "such"            
  [49] "nonsense"         "Mr"               "Dursley"          "was"             
  [53] "the"              "director"         "of"               "a"               
  [57] "firm"             "called"           "Grunnings"        "which"           
  [61] "made"             "drills"           "He"               "was"             
  [65] "a"                "big"              "beefy"            "man"             
  [69] "with"             "hardly"           "any"              "neck"            
  [73] "although"         "he"               "did"              "have"            
  [77] "a"                "very"             "large"            "mustache"        
  [81] "Mrs"              "Dursley"          "was"              "thin"            
  [85] "and"              "blonde"           "and"              "had"             
  [89] "nearly"           "twice"            "the"              "usual"           
  [93] "amount"           "of"               "neck"             "which"           
  [97] "came"             "in"               "very"             "useful"          
 [101] "as"               "she"              "spent"            "so"              
 [105] "much"             "of"               "her"              "time"            
 [109] "craning"          "over"             "garden"           "fences"          
 [113] "spying"           "on"               "the"              "neighbors"       
 [117] "The"              "Dursleys"         "had"              "a"               
 [121] "small"            "son"              "called"           "Dudley"          
 [125] "and"              "in"               "their"            "opinion"         
 [129] "there"            "was"              "no"               "finer"           
 [133] "boy"              "anywhere"         "The"              "Dursleys"        
 [137] "had"              "everything"       "they"             "wanted"          
 [141] "but"              "they"             "also"             "had"             
 [145] "a"                "secret"           "and"              "their"           
 [149] "greatest"         "fear"             "was"              "that"            
 [153] "somebody"         "would"            "discover"         "it"              
 [157] "They"             "didn't"           "think"            "they"            
 [161] "could"            "bear"             "it"               "if"              
 [165] "anyone"           "found"            "out"              "about"           
 [169] "the"              "Potters"          "Mrs"              "Potter"          
 [173] "was"              "Mrs"              "Dursley's"        "sister"          
 [177] "but"              "they"             "hadn't"           "met"             
 [181] "for"              "several"          "years"            "in"              
 [185] "fact"             "Mrs"              "Dursley"          "pretended"       
 [189] "she"              "didn't"           "have"             "a"               
 [193] "sister"           "because"          "her"              "sister"          
 [197] "and"              "her"              "good-for-nothing" "husband"         
 [201] "were"             "as"               "unDursleyish"     "as"              
 [205] "it"               "was"              "possible"         "to"              
 [209] "be"               "The"              "Dursleys"         "shuddered"       
 [213] "to"               "think"            "what"             "the"             
 [217] "neighbors"        "would"            "say"              "if"              
 [221] "the"              "Potters"          "arrived"          "in"              
 [225] "the"              "street"           "The"              "Dursleys"        
 [229] "knew"             "that"             "the"              "Potters"         
 [233] "had"              "a"                "small"            "son"             
 [237] "too"              "but"              "they"             "had"             
 [241] "never"            "even"             "seen"             "him"             
 [245] "This"             "boy"              "was"              "another"         
 [249] "good"             "reason"           "for"              "keeping"         
 [253] "the"              "Potters"          "away"             "they"            
 [257] "didn't"           "want"             "Dudley"           "mixing"          
 [261] "with"             "a"                "child"            "like"            
 [265] "that"             "When"             "Mr"               "and"             
 [269] "Mrs"              "Dursley"          "woke"             "up"              
 [273] "on"               "the"              "dull"             "gray"            
 [277] "Tuesday"          "our"              "story"            "starts"          
 [281] "there"            "was"              "nothing"          "about"           
 [285] "the"              "cloudy"           "sky"              "outside"         
 [289] "to"               "suggest"          "that"             "strange"         
 [293] "and"              "mysterious"       "things"           "would"           
 [297] "soon"             "be"               "happening"        "all"             
 [301] "over"             "the"              "country"          "Mr"              
 [305] "Dursley"          "hummed"           "as"               "he"              
 [309] "picked"           "out"              "his"              "most"            
 [313] "boring"           "tie"              "for"              "work"            
 [317] "and"              "Mrs"              "Dursley"          "gossiped"        
 [321] "away"             "happily"          "as"               "she"             
 [325] "wrestled"         "a"                "screaming"        "Dudley"          
 [329] "into"             "his"              "high"             "chair"           
 [333] "None"             "of"               "them"             "noticed"         
 [337] "a"                "large"            "tawny"            "owl"             
 [341] "flutter"          "past"             "the"              "window"          
 [345] "At"               "half"             "past"             "eight"           
 [349] "Mr"               "Dursley"          "picked"           "up"              
 [353] "his"              "briefcase"        "pecked"           "Mrs"             
 [357] "Dursley"          "on"               "the"              "cheek"           
 [361] "and"              "tried"            "to"               "kiss"            
 [365] "Dudley"           "good-bye"         "but"              "missed"          
 [369] "because"          "Dudley"           "was"              "now"             
 [373] "having"           "a"                "tantrum"          "and"             
 [377] "throwing"         "his"              "cereal"           "at"              
 [381] "the"              "walls"            "Little"           "tyke"            
 [385] "chortled"         "Mr"               "Dursley"          "as"              
 [389] "he"               "left"             "the"              "house"           
 [393] "He"               "got"              "into"             "his"             
 [397] "car"              "and"              "backed"           "out"             
 [401] "of"               "number"           "four's"           "drive"           
 [405] "It"               "was"              "on"               "the"             
 [409] "corner"           "of"               "the"              "street"          
 [413] "that"             "he"               "noticed"          "the"             
 [417] "first"            "sign"             "of"               "something"       
 [421] "peculiar"         "a"                "cat"              "reading"         
 [425] "a"                "map"              "For"              "a"               
 [429] "second"           "Mr"               "Dursley"          "didn't"          
 [433] "realize"          "what"             "he"               "had"             
 [437] "seen"             "then"             "he"               "jerked"          
 [441] "his"              "head"             "around"           "to"              
 [445] "look"             "again"            "There"            "was"             
 [449] "a"                "tabby"            "cat"              "standing"        
 [453] "on"               "the"              "corner"           "of"              
 [457] "Privet"           "Drive"            "but"              "there"           
 [461] "wasn't"           "a"                "map"              "in"              
 [465] "sight"            "What"             "could"            "he"              
 [469] "have"             "been"             "thinking"         "of"              
 [473] "It"               "must"             "have"             "been"            
 [477] "a"                "trick"            "of"               "the"             
 [481] "light"            "Mr"               "Dursley"          "blinked"         
 [485] "and"              "stared"           "at"               "the"             
 [489] "cat"              "It"               "stared"           "back"            
 [493] "As"               "Mr"               "Dursley"          "drove"           
 [497] "around"           "the"              "corner"           "and"             
 [501] "up"               "the"              "road"             "he"              
 [505] "watched"          "the"              "cat"              "in"              
 [509] "his"              "mirror"           "It"               "was"             
 [513] "now"              "reading"          "the"              "sign"            
 [517] "that"             "said"             "Privet"           "Drive"           
 [521] "no"               "looking"          "at"               "the"             
 [525] "sign"             "cats"             "couldn't"         "read"            
 [529] "maps"             "or"               "signs"            "Mr"              
 [533] "Dursley"          "gave"             "himself"          "a"               
 [537] "little"           "shake"            "and"              "put"             
 [541] "the"              "cat"              "out"              "of"              
 [545] "his"              "mind"             "As"               "he"              
 [549] "drove"            "toward"           "town"             "he"              
 [553] "thought"          "of"               "nothing"          "except"          
 [557] "a"                "large"            "order"            "of"              
 [561] "drills"           "he"               "was"              "hoping"          
 [565] "to"               "get"              "that"             "day"             
 [569] "But"              "on"               "the"              "edge"            
 [573] "of"               "town"             "drills"           "were"            
 [577] "driven"           "out"              "of"               "his"             
 [581] "mind"             "by"               "something"        "else"            
 [585] "As"               "he"               "sat"              "in"              
 [589] "the"              "usual"            "morning"          "traffic"         
 [593] "jam"              "he"               "couldn't"         "help"            
 [597] "noticing"         "that"             "there"            "seemed"          
 [601] "to"               "be"               "a"                "lot"             
 [605] "of"               "strangely"        "dressed"          "people"          
 [609] "about"            "People"           "in"               "cloaks"          
 [613] "Mr"               "Dursley"          "couldn't"         "bear"            
 [617] "people"           "who"              "dressed"          "in"              
 [621] "funny"            "clothes"          "the"              "getups"          
 [625] "you"              "saw"              "on"               "young"           
 [629] "people"           "He"               "supposed"         "this"            
 [633] "was"              "some"             "stupid"           "new"             
 [637] "fashion"          "He"               "drummed"          "his"             
 [641] "fingers"          "on"               "the"              "steering"        
 [645] "wheel"            "and"              "his"              "eyes"            
 [649] "fell"             "on"               "a"                "huddle"          
 [653] "of"               "these"            "weirdos"          "standing"        
 [657] "quite"            "close"            "by"               "They"            
 [661] "were"             "whispering"       "excitedly"        "together"        
 [665] "Mr"               "Dursley"          "was"              "enraged"         
 [669] "to"               "see"              "that"             "a"               
 [673] "couple"           "of"               "them"             "weren't"         
 [677] "young"            "at"               "all"              "why"             
 [681] "that"             "man"              "had"              "to"              
 [685] "be"               "older"            "than"             "he"              
 [689] "was"              "and"              "wearing"          "an"              
 [693] "emerald-green"    "cloak"            "The"              "nerve"           
 [697] "of"               "him"              "But"              "then"            
 [701] "it"               "struck"           "Mr"               "Dursley"         
 [705] "that"             "this"             "was"              "probably"        
 [709] "some"             "silly"            "stunt"            "these"           
 [713] "people"           "were"             "obviously"        "collecting"      
 [717] "for"              "something"        "yes"              "that"            
 [721] "would"            "be"               "it"               "The"             
 [725] "traffic"          "moved"            "on"               "and"             
 [729] "a"                "few"              "minutes"          "later"           
 [733] "Mr"               "Dursley"          "arrived"          "in"              
 [737] "the"              "Grunnings"        "parking"          "lot"             
 [741] "his"              "mind"             "back"             "on"              
 [745] "drills"           "Mr"               "Dursley"          "always"          
 [749] "sat"              "with"             "his"              "back"            
 [753] "to"               "the"              "window"           "in"              
 [757] "his"              "office"           "on"               "the"             
 [761] "ninth"            "floor"            "If"               "he"              
 [765] "hadn't"           "he"               "might"            "have"            
 [769] "found"            "it"               "harder"           "to"              
 [773] "concentrate"      "on"               "drills"           "that"            
 [777] "morning"          "He"               "didn't"           "see"             
 [781] "the"              "owls"             "swoop"            "ing"             
 [785] "past"             "in"               "broad"            "daylight"        
 [789] "though"           "people"           "down"             "in"              
 [793] "the"              "street"           "did"              "they"            
 [797] "pointed"          "and"              "gazed"            "open-"           
 [801] "mouthed"          "as"               "owl"              "after"           
 [805] "owl"              "sped"             "overhead"         "Most"            
 [809] "of"               "them"             "had"              "never"           
 [813] "seen"             "an"               "owl"              "even"            
 [817] "at"               "nighttime"        "Mr"               "Dursley"         
 [821] "however"          "had"              "a"                "perfectly"       
 [825] "normal"           "owl-free"         "morning"          "He"              
 [829] "yelled"           "at"               "five"             "different"       
 [833] "people"           "He"               "made"             "several"         
 [837] "important"        "telephone"        "calls"            "and"             
 [841] "shouted"          "a"                "bit"              "more"            
 [845] "He"               "was"              "in"               "a"               
 [849] "very"             "good"             "mood"             "until"           
 [853] "lunchtime"        "when"             "he"               "thought"         
 [857] "he'd"             "stretch"          "his"              "legs"            
 [861] "and"              "walk"             "across"           "the"             
 [865] "road"             "to"               "buy"              "himself"         
 [869] "a"                "bun"              "from"             "the"             
 [873] "bakery"           "He'd"             "forgotten"        "all"             
 [877] "about"            "the"              "people"           "in"              
 [881] "cloaks"           "until"            "he"               "passed"          
 [885] "a"                "group"            "of"               "them"            
 [889] "next"             "to"               "the"              "baker's"         
 [893] "He"               "eyed"             "them"             "angrily"         
 [897] "as"               "he"               "passed"           "He"              
 [901] "didn't"           "know"             "why"              "but"             
 [905] "they"             "made"             "him"              "uneasy"          
 [909] "This"             "bunch"            "were"             "whispering"      
 [913] "excitedly"        "too"              "and"              "he"              
 [917] "couldn't"         "see"              "a"                "single"          
 [921] "collecting"       "tin"              "It"               "was"             
 [925] "on"               "his"              "way"              "back"            
 [929] "past"             "them"             "clutching"        "a"               
 [933] "large"            "doughnut"         "in"               "a"               
 [937] "bag"              "that"             "he"               "caught"          
 [941] "a"                "few"              "words"            "of"              
 [945] "what"             "they"             "were"             "saying"          
 [949] "The"              "Potters"          "that's"           "right"           
 [953] "that's"           "what"             "I"                "heard"           
 [957] "yes"              "their"            "son"              "Harry"           
 [961] "Mr"               "Dursley"          "stopped"          "dead"            
 [965] "Fear"             "flooded"          "him"              "He"              
 [969] "looked"           "back"             "at"               "the"             
 [973] "whisperers"       "as"               "if"               "he"              
 [977] "wanted"           "to"               "say"              "something"       
 [981] "to"               "them"             "but"              "thought"         
 [985] "better"           "of"               "it"               "He"              
 [989] "dashed"           "back"             "across"           "the"             
 [993] "road"             "hurried"          "up"               "to"              
 [997] "his"              "office"           "snapped"          "at"              
 [ reached getOption("max.print") -- omitted 3591 entries ]

hp1_afinn2 <- textstat_valence(hp1_tokenized, afinn2, normalize="dictionary")

hp1_afinn2.df <- as.data.frame.matrix(hp1_afinn2)

hp1_afinn2.df$chapter <- 1:nrow(hp1_afinn2.df)

plot <- ggplot(hp1_afinn2.df, aes(x =hp1_afinn2.df$chapter, y=sentiment)) +
          geom_bar(alpha = 0.8, stat = "identity", show.legend = FALSE)
plot + ylim(-1.0, 1.0) + labs(y="sentiment", x = "chapter") + ggtitle("HP1 - AFINN")
Warnung: Use of `hp1_afinn2.df$chapter` is discouraged. Use `chapter` instead.

#hp1_afinn2

VADER

get_vader(philosophers_stone[1])

hp1_vader <- vader_df(philosophers_stone)

library("quanteda", warn.conflicts = FALSE, verbose = FALSE)
library("quanteda.sentiment", warn.conflicts = FALSE, verbose = FALSE)

print(data_dictionary_LSD2015, max_nval = 5)
lengths(data_dictionary_LSD2015)

quanteda.sentiment: AFINN

series_tokenized %>%
  group_by(book, chapter) %>% # group df by book and chapter to get sentiment per chapter
  summarise(sentiment = mean(afinn2, na.rm = TRUE)) %>% # calculate mean w/o regarding na values
  mutate(method = "AFINN") %>% # add column with method 
        ggplot(aes(chapter, sentiment, fill = book)) + # plot sentiment of books
          geom_bar(alpha = 0.8, stat = "identity", show.legend = FALSE) +
          facet_wrap(~ book, ncol = 2, scales = "free_x") +
          ggtitle("AFINN HP")
`summarise()` has grouped output by 'book'. You can override using the `.groups` argument.

quanteda.sentiment: Lexicoder

LS0tCnRpdGxlOiAiQ29tcGFyaXNvbiBvZiBTZW50aW1lbnQgVG9vbHMgYWNyb3NzIERvbWFpbnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkhpbnQ6ClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLiAKCmBgYHtyfQojIGxvYWQgcmVxdWlyZWQgbGlicmFyaWVzCgojIHRvIHVzZSBoYXJyeSBwb3R0ZXIgZGF0YXNldAojIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYnJhZGxleWJvZWhta2UvaGFycnlwb3R0ZXIiKQojIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicXVhbnRlZGEvcXVhbnRlZGEuc2VudGltZW50IikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInF1YW50ZWRhL3F1YW50ZWRhLmNvcnBvcmEiKQoKCgpsaWJyYXJ5KHF1YW50ZWRhKQpsaWJyYXJ5KHJlYWR0ZXh0KQpsaWJyYXJ5KGNvcnB1cykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShoYXJyeXBvdHRlcikKbGlicmFyeShqYW5lYXVzdGVucikKbGlicmFyeShkcGx5cikKbGlicmFyeShxdWFudGVkYS5zZW50aW1lbnQpCmxpYnJhcnkodmFkZXIpCgpgYGAKCmBgYHtyfQojIGxvYWQgYWZpbm4gbGV4aWNvbgoKIyBtYW51YWxseSAtPiBjb252ZXJ0IHRvIGJpbmFyeSBsZXhpY29uCmFmaW5uX2RpY3QgPC0gcmVhZC5jc3YoImxleGlrYS9BRklOTi0xMTEudHh0IiwgaGVhZGVyID0gRiwgc2VwID0gIlx0Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCmFmaW5uX2JpbmFyeSA8LSBkaWN0aW9uYXJ5KGxpc3QocG9zaXRpdmUgPSBhZmlubl9kaWN0JFYxW2FmaW5uX2RpY3QkVjI+MF0sIG5lZ2F0aXZlID0gYWZpbm5fZGljdCRWMVthZmlubl9kaWN0JFYyPDBdKSkKCiMgcHJvdmlkZWQgdmlhIHRpZHl0ZXh0PwphZmlubiA8LSBnZXRfc2VudGltZW50cygiYWZpbm4iKQoKYGBgCgpgYGB7cn0KZGZtLnNlbnRpbWVudCA8LSBkZm0oa29ycHVzLCBkaWN0aW9uYXJ5ID0gYWZpbm5fYmluYXJ5KQoKZGZtLnNlbnRpbWVudApgYGAKIyBIYXJyeSBQb3R0ZXIgLSBEYXRhc2V0CmBgYHtyfQojIGxvYWQgaGFycnkgcG90dGVyIGRhdGFzZXQgCnRpdGxlcyA8LSBjKCJQaGlsb3NvcGhlcidzIFN0b25lIiwgIkNoYW1iZXIgb2YgU2VjcmV0cyIsICJQcmlzb25lciBvZiBBemthYmFuIiwKICAgICAgICAgICAgIkdvYmxldCBvZiBGaXJlIiwgIk9yZGVyIG9mIHRoZSBQaG9lbml4IiwgIkhhbGYtQmxvb2QgUHJpbmNlIiwKICAgICAgICAgICAgIkRlYXRobHkgSGFsbG93cyIpCgpib29rcyA8LSBsaXN0KHBoaWxvc29waGVyc19zdG9uZSwgY2hhbWJlcl9vZl9zZWNyZXRzLCBwcmlzb25lcl9vZl9hemthYmFuLAogICAgICAgICAgIGdvYmxldF9vZl9maXJlLCBvcmRlcl9vZl90aGVfcGhvZW5peCwgaGFsZl9ibG9vZF9wcmluY2UsCiAgICAgICAgICAgZGVhdGhseV9oYWxsb3dzKQogIApzZXJpZXMgPC0gdGliYmxlKCkKCmZvcihpIGluIHNlcV9hbG9uZyh0aXRsZXMpKSB7CiAgICAgICAgCiAgICAgICAgY2xlYW4gPC0gdGliYmxlKGNoYXB0ZXIgPSBzZXFfYWxvbmcoYm9va3NbW2ldXSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBib29rc1tbaV1dKSAlPiUKICAgICAgICAgICAgICN1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpICU+JQogICAgICAgICAgICAgbXV0YXRlKGJvb2sgPSB0aXRsZXNbaV0pICU+JQogICAgICAgICAgICAgc2VsZWN0KGJvb2ssIGV2ZXJ5dGhpbmcoKSkKCiAgICAgICAgc2VyaWVzIDwtIHJiaW5kKHNlcmllcywgY2xlYW4pCn0KCnNlcmllcyRib29rIDwtIGZhY3RvcihzZXJpZXMkYm9vaywgbGV2ZWxzID0gcmV2KHRpdGxlcykpCgpzZXJpZXMKI2Jvb2tfZ3JvdXBzIDwtIHNlcmllcyAlPiUgZ3JvdXBfYnkoYm9vaywgY2hhcHRlcikKYGBgCgoKIyMjIEhhcnJ5IFBvdHRlciAtIEFGSU5OIExleGljb24KYGBge3J9CmFmaW5uX2hwMSA8LSBzZXJpZXMgJT4lCiAgICAgICAgZ3JvdXBfYnkoYm9vaykgJT4lIAogICAgICAgIG11dGF0ZSh3b3JkX2NvdW50ID0gMTpuKCksCiAgICAgICAgICAgICAgIGluZGV4ID0gd29yZF9jb3VudCAlLyUgNTAwICsgMSkgJT4lIAogICAgICAgIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImFmaW5uIikpICU+JQogICAgICAgIGdyb3VwX2J5KGJvb2ssIGluZGV4LCBjaGFwdGVyKSAlPiUKICAgICAgICBzdW1tYXJpc2Uoc2VudGltZW50ID0gc3VtKHZhbHVlKSkgJT4lCiAgICAgICAgbXV0YXRlKG1ldGhvZCA9ICJBRklOTiIpCgphZmlubl9ocDEKYGBgCgpgYGB7cn0KYWZpbm5faHAyIDwtIHNlcmllcyAlPiUKICAgICAgICBncm91cF9ieShib29rLCBjaGFwdGVyKSAlPiUgIyBhZGQgd29yZCBmb3Igc2luZ2xlIHdvcmQgc2NvcmVzIAogICAgICAgIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImFmaW5uIikpICU+JQogICAgICAgIGdyb3VwX2J5KGJvb2ssIGNoYXB0ZXIpICU+JSAjIGFkZCB3b3JkIGZvciBzaW5nbGUgd29yZCBzY29yZXMKICAgICAgICAjc3VtbWFyaXNlKHNlbnRpbWVudCA9IHN1bSh2YWx1ZSkpICU+JQogICAgICAgIHN1bW1hcmlzZShzZW50aW1lbnQgPSBtZWFuKHZhbHVlLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgICAgICBtdXRhdGUobWV0aG9kID0gIkFGSU5OIikgICU+JQogICAgICAgIGdncGxvdChhZXMoY2hhcHRlciwgc2VudGltZW50LCBmaWxsID0gYm9vaykpICsKICAgICAgICAgIGdlb21fYmFyKGFscGhhID0gMC44LCBzdGF0ID0gImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgICAgICAgZmFjZXRfd3JhcCh+IGJvb2ssIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZV94IikKCmFmaW5uX2hwMgoKI2dnc2F2ZShwbG90ID0gYWZpbm4sIHdpZHRoID0gMTUsIGhlaWdodCA9IDE1LCBkcGkgPSAzMDAsIGZpbGVuYW1lID0gImFmaW5uX2hwX21lYW4ucG5nIikKYGBgCgojIEphbmUgQXVzdGVuIC0gRGF0YXNldApgYGB7cn0KdGlkeV9ib29rcyA8LSBhdXN0ZW5fYm9va3MoKSAlPiUKICBncm91cF9ieShib29rKSAlPiUKICBtdXRhdGUoCiAgICBsaW5lbnVtYmVyID0gcm93X251bWJlcigpLAogICAgY2hhcHRlciA9IGN1bXN1bShzdHJfZGV0ZWN0KHRleHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4KCJeY2hhcHRlciBbXFxkaXZ4bGNdIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KQpgYGAKCmBgYHtyfQpwcmlkZV9wcmVqdWRpY2UgPC0gdGlkeV9ib29rcyAlPiUgCiAgZmlsdGVyKGJvb2sgPT0gIlByaWRlICYgUHJlanVkaWNlIikKYGBgCgojIyMgSmFuZSBBdXN0ZW4gLSBBRklOTiBMZXhpY29uCmBgYHtyfQphZmlubl9hdXN0ZW4gPC0gcHJpZGVfcHJlanVkaWNlICU+JSAKICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJhZmlubiIpKSAlPiUgCiAgZ3JvdXBfYnkoaW5kZXggPSBsaW5lbnVtYmVyICUvJSA4MCkgJT4lIAogIHN1bW1hcmlzZShzZW50aW1lbnQgPSBzdW0odmFsdWUpKSAlPiUgCiAgbXV0YXRlKG1ldGhvZCA9ICJBRklOTiIpCmBgYAoKIyMjIGxvYWQgYWZpbm4gdmlhIHF1YW50ZWRhLnNlbnRpbWVudApgYGB7cn0KYWZpbm4yIDwtIGRhdGFfZGljdGlvbmFyeV9BRklOTgoKYWZpbm4yCgoKI2RhdGFfZGljdGlvbmFyeV9MU0QyMDE1X3Bvc19uZWcgPC0gZGF0YV9kaWN0aW9uYXJ5X0xTRDIwMTVbMToyXQojZGF0YV9kaWN0aW9uYXJ5X0xTRDIwMTUKYGBgCmBgYHtyfQpsaWJyYXJ5KCJxdWFudGVkYSIsIHdhcm4uY29uZmxpY3RzID0gRkFMU0UsIHF1aWV0bHkgPSBUUlVFKQpwcmludChkYXRhX2RpY3Rpb25hcnlfQUZJTk4sIG1heF9udmFsID0gOCkKYGBgCgojIExleGljb2RlciBTZW50aW1lbnQgRGljdGlvbmFyeQpgYGB7cn0KcmVxdWlyZShxdWFudGVkYSkKcmVxdWlyZShxdWFudGVkYS5jb3Jwb3JhKQpyZXF1aXJlKHF1YW50ZWRhLnNlbnRpbWVudCkKYGBgCgpgYGB7cn0KIyB0b2tlbml6ZSBocDEKaHAxX3Rva2VuaXplZCA8LSB0b2tlbnNfdG9sb3dlcih0b2tlbnMocGhpbG9zb3BoZXJzX3N0b25lLCByZW1vdmVfcHVuY3QgPSBUUlVFKSkgCiAgCgojIHRva2VuaXplIHdob2xlIGNvcnB1cwojdG9rZW5pemVkX2hwX2FsbCA8LSBzZXJpZXMgJT4lCiAjIHRva3MgPC0gdG9rZW5zKHJlbW92ZV9wdW5jdCA9IFRSVUUsIHJlbW92ZV9zeW1ib2xzID0gVFJVRSkgJT4lCiAgI3Rva2Vuc190b2xvd2VyKHRva3MpCmBgYAoKYGBge3J9CmhwMV90b2tlbml6ZWRbWzFdXQpgYGAKCmBgYHtyfQojIHNlbGVjdCBvbmx5IHRoZSAibmVnYXRpdmUiIGFuZCAicG9zaXRpdmUiIGNhdGVnb3JpZXMKI2RhdGFfZGljdGlvbmFyeV9MU0QyMDE1X3Bvc19uZWcgPC0gZGF0YV9kaWN0aW9uYXJ5X0xTRDIwMTVbMToyXQoKI2hwMV9sc2QgPC0gdG9rZW5zX2xvb2t1cChocDFfdG9rZW5pemVkLCBkaWN0aW9uYXJ5ID0gZGF0YV9kaWN0aW9uYXJ5X0xTRDIwMTVfcG9zX25lZykKCnBvbGFyaXR5KGRhdGFfZGljdGlvbmFyeV9MU0QyMDE1KSA8LSAKICBsaXN0KHBvcyA9IGMoInBvc2l0aXZlIiwgIm5lZ19uZWdhdGl2ZSIpLCBuZWcgPSBjKCJuZWdhdGl2ZSIsICJuZWdfcG9zaXRpdmUiKSkKCmhwMV9sc2QgPC0gdGV4dHN0YXRfcG9sYXJpdHkoaHAxX3Rva2VuaXplZCwgZGF0YV9kaWN0aW9uYXJ5X0xTRDIwMTUpCgpocDFfbHNkX3Rva2VucyA8LSB0b2tlbnNfbG9va3VwKGhwMV90b2tlbml6ZWQsIGRhdGFfZGljdGlvbmFyeV9MU0QyMDE1LCBuZXN0ZWRfc2NvcGUgPSAiZGljdGlvbmFyeSIsIGV4Y2x1c2l2ZSA9IEZBTFNFKQoKaHAxX2xzZApgYGAKCmBgYHtyfQojIGhwMV9sc2RfdG9rZW5zCmhwMV9sc2QuZGYgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgoaHAxX2xzZCkKCmhwMV9sc2QuZGYkY2hhcHRlciA8LSAxOm5yb3coaHAxX2xzZC5kZikKCnBsb3QgPC0gZ2dwbG90KGhwMV9sc2QsIGFlcyh4ID1ocDFfbHNkLmRmJGNoYXB0ZXIsIHk9c2VudGltZW50KSkgKwogICAgICAgICAgZ2VvbV9iYXIoYWxwaGEgPSAwLjgsIHN0YXQgPSAiaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKQpwbG90ICsgeWxpbSgtMS4wLCAxLjApICsgbGFicyh5PSJzZW50aW1lbnQiLCB4ID0gImNoYXB0ZXIiKSArIGdndGl0bGUoIkhQMSAtIExleGljb2RlciIpCgojaHAxX2xzZC5kZgoKYGBgCgpgYGB7cn0KaHAxX2FmaW5uMiA8LSB0ZXh0c3RhdF92YWxlbmNlKGhwMV90b2tlbml6ZWQsIGFmaW5uMiwgbm9ybWFsaXplPSJkaWN0aW9uYXJ5IikKCmhwMV9hZmlubjIuZGYgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgoaHAxX2FmaW5uMikKCmhwMV9hZmlubjIuZGYkY2hhcHRlciA8LSAxOm5yb3coaHAxX2FmaW5uMi5kZikKCnBsb3QgPC0gZ2dwbG90KGhwMV9hZmlubjIuZGYsIGFlcyh4ID1ocDFfYWZpbm4yLmRmJGNoYXB0ZXIsIHk9c2VudGltZW50KSkgKwogICAgICAgICAgZ2VvbV9iYXIoYWxwaGEgPSAwLjgsIHN0YXQgPSAiaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKQpwbG90ICsgeWxpbSgtMS4wLCAxLjApICsgbGFicyh5PSJzZW50aW1lbnQiLCB4ID0gImNoYXB0ZXIiKSArIGdndGl0bGUoIkhQMSAtIEFGSU5OIikKCgojaHAxX2FmaW5uMgpgYGAKCiMgVkFERVIKCmBgYHtyfQpnZXRfdmFkZXIocGhpbG9zb3BoZXJzX3N0b25lWzFdKQoKaHAxX3ZhZGVyIDwtIHZhZGVyX2RmKHBoaWxvc29waGVyc19zdG9uZSkKYGBgCmBgYHtyfQpocDFfdmFkZXIKCgpocDFfdmFkZXIkY2hhcHRlciA8LSAxOm5yb3coaHAxX3ZhZGVyKQoKcGxvdCA8LSBnZ3Bsb3QoaHAxX3ZhZGVyLCBhZXMoeCA9Y2hhcHRlciwgeT1jb21wb3VuZCkpICsKICAgICAgICAgIGdlb21fYmFyKGFscGhhID0gMC44LCBzdGF0ID0gImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkKcGxvdCArIHlsaW0oLTUuMCwgNS4wKSArIGxhYnMoeT0ic2VudGltZW50IiwgeCA9ICJjaGFwdGVyIikgKyBnZ3RpdGxlKCJIUDEgLSBWQURFUiIpCmBgYAoKYGBge3J9CmxpYnJhcnkoInF1YW50ZWRhIiwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpsaWJyYXJ5KCJxdWFudGVkYS5zZW50aW1lbnQiLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCgpwcmludChkYXRhX2RpY3Rpb25hcnlfTFNEMjAxNSwgbWF4X252YWwgPSA1KQpsZW5ndGhzKGRhdGFfZGljdGlvbmFyeV9MU0QyMDE1KQpgYGAKCiMgcXVhbnRlZGEuc2VudGltZW50OiBBRklOTgpgYGB7cn0KIyBXb3JrIHdpdGggcXVhbnRlZGEuc2VudGltZW50IG9uIEhQIGNvcnB1czoKCiMgY29udmVydCB0aWJibGUgdG8gZGF0YWZyYW1lCnNlcmllcy5kZiA8LSBhcy5kYXRhLmZyYW1lKHNlcmllcykKCiMgdG9rZW5pemUgYm9va3MKc2VyaWVzX3Rva2VuaXplZCA8LSBzZXJpZXMuZGYgJT4lCiAgdW5uZXN0X3Rva2Vucyh0b2tlbnMsIHRleHQpCgojIGFwcGx5IGFmaW5uIGxleGljb24Kc2VyaWVzX3Rva2VuaXplZCRhZmlubjIgPC0gdGV4dHN0YXRfdmFsZW5jZShzZXJpZXNfdG9rZW5pemVkJHRva2VucywgYWZpbm4yKSRzZW50aW1lbnQKCiMgcmVwbGFjZSBhbGwgMCB2YWx1ZXMgd2l0aCBuYQpzZXJpZXNfdG9rZW5pemVkW3Nlcmllc190b2tlbml6ZWQgPT0gMF0gPC0gTkEKCnNlcmllc190b2tlbml6ZWQgJT4lCiAgZ3JvdXBfYnkoYm9vaywgY2hhcHRlcikgJT4lICMgZ3JvdXAgZGYgYnkgYm9vayBhbmQgY2hhcHRlciB0byBnZXQgc2VudGltZW50IHBlciBjaGFwdGVyCiAgc3VtbWFyaXNlKHNlbnRpbWVudCA9IG1lYW4oYWZpbm4yLCBuYS5ybSA9IFRSVUUpKSAlPiUgIyBjYWxjdWxhdGUgbWVhbiB3L28gcmVnYXJkaW5nIG5hIHZhbHVlcwogIG11dGF0ZShtZXRob2QgPSAiQUZJTk4iKSAlPiUgIyBhZGQgY29sdW1uIHdpdGggbWV0aG9kIAogICAgICAgIGdncGxvdChhZXMoY2hhcHRlciwgc2VudGltZW50LCBmaWxsID0gYm9vaykpICsgIyBwbG90IHNlbnRpbWVudCBvZiBib29rcwogICAgICAgICAgZ2VvbV9iYXIoYWxwaGEgPSAwLjgsIHN0YXQgPSAiaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICAgICAgICBmYWNldF93cmFwKH4gYm9vaywgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3giKSArCiAgICAgICAgICBnZ3RpdGxlKCJBRklOTiBIUCIpCmBgYAoKIyBxdWFudGVkYS5zZW50aW1lbnQ6IExleGljb2RlciAKYGBge3J9CiMgV29yayB3aXRoIHF1YW50ZWRhLnNlbnRpbWVudCBvbiBIUCBjb3JwdXM6CgojIGFwcGx5IGxleGljb2RlciBsZXhpY29uCnNlcmllcyRsc2QgPC0gdGV4dHN0YXRfcG9sYXJpdHkodG9rZW5zKHNlcmllcyR0ZXh0KSwgZGF0YV9kaWN0aW9uYXJ5X0xTRDIwMTUpJHNlbnRpbWVudCAKCiNzZXJpZXMuZGYgPC0gYXMuZGF0YS5mcmFtZShzZXJpZXMpCgpwbG90IDwtIGdncGxvdChzZXJpZXMsIGFlcyhjaGFwdGVyLCBsc2QsIGZpbGwgPSBib29rKSkgKyAjIHBsb3Qgc2VudGltZW50IG9mIGJvb2tzCiAgICAgICAgICBnZW9tX2JhcihhbHBoYSA9IDAuOCwgc3RhdCA9ICJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICAgICAgIGZhY2V0X3dyYXAofiBib29rLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeCIpICsKICAgICAgICAgIGdndGl0bGUoIkxleGljb2RlciBIUCIpCnBsb3QgCmBgYAoKCgoK